home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 12, No. 10 (1991-10)(MindCraft Publishing)(Side A)[a].zip / Nibble Volume 12, No. 10 (1991-10)(MindCraft Publishing)(Side A)[a].po / FILE.SIFTER.bas < prev    next >
BASIC Source File  |  1996-12-24  |  16KB  |  371 lines

  1. 10  REM **************************
  2. 20  REM *  FILE.SIFTER           *
  3. 30  REM *  by Charles T. Hill    *
  4. 40  REM *  Copyright(c) 1991     *
  5. 50  REM *  Mindcraft Publ. Corp. *
  6. 60  REM *  Lincoln, MA 01773     *
  7. 70  REM **************************
  8. 80 :
  9. 90  REM INITIALIZE VARIABLES
  10. 100  ONERR  GOTO 3450
  11. 110  IF  PEEK(48640) < >76  THEN  PRINT "PROGRAM REQUIRES PRODOS": END 
  12. 120 D$ =  CHR$(4): PRINT D$;"PR#3":HT = 1403
  13. 130  DIM FI$(20),W$(100)
  14. 140 :
  15. 150  REM GREETING
  16. 160  HOME : NORMAL : PRINT : VTAB 4
  17. 170  PRINT  SPC( 25);"FILE SIFTER"
  18. 180  PRINT  SPC( 25);"By Charles T. Hill"
  19. 190  PRINT  SPC( 25);"Copyright(c) 1991"
  20. 200  PRINT  SPC( 25);"Mindcraft Publ. Corp"
  21. 210  PRINT  SPC( 25);"Lincoln, MA 01773"
  22. 220  PRINT : PRINT 
  23. 230  PRINT  SPC( 15);"A utility for removing carriage returns,
  24. 240  PRINT  SPC( 15);"control characters, and/or left margins"
  25. 250  PRINT  SPC( 15);"from TXT or AWP or other files."
  26. 260  PRINT 
  27. 270  PRINT  SPC( 15);"Use letters or up-down arrows to select lines,"
  28. 280  PRINT  SPC( 15);"right-left arrows to see additional files,"
  29. 290  PRINT  SPC( 15);"RETURN to select a file or subdirectory,"
  30. 300  PRINT  SPC( 15);"and ESC to back up or exit to Basic."
  31. 310  PRINT 
  32. 320 :
  33. 330  REM INPUT PREFIX
  34. 340 LA$ = "": REM RESET LABELS TO INDICATE DIR NOT READ FOR RESTART
  35. 350  PRINT : PRINT  SPC( 8);"PREFIX OR SLOT NUMBER: ";
  36. 360 IS = 1: GOSUB 1100: REM GET LINE
  37. 370  IF GL$ = ""  OR GL$ =  CHR$(27)  THEN 1660: REM CHECK FOR END
  38. 380 PS$ = GL$:SN =  VAL(PS$)
  39. 390  IF (SN <1  OR SN >7)  THEN P$ = PS$: GOTO 450: REM not a slot 
  40. 400  PRINT : PRINT  SPC( 16);"DRIVE NUMBER: ";
  41. 410 IS = 0: GOSUB 1100: REM GET LINE
  42. 420  IF GL$ =  CHR$(27)  THEN 1660: REM CHECK FOR END
  43. 430 PD$ = GL$
  44. 440 P$ = ",S" +PS$ +",D" +PD$: REM CONSTRUCT PATH USING SLOT,DRIVE 
  45. 450  PRINT D$;"PREFIX";P$: REM ENTER PATH
  46. 460  PRINT D$;"PREFIX": INPUT P$: REM RETRIEVE FULL PREFIX   
  47. 470 P$ =  LEFT$(P$, LEN(P$) -1): REM strip trailing slash    
  48. 480 :
  49. 490  REM OPEN DIRECTORY
  50. 500  VTAB 23: POKE HT,79: PRINT : REM AVOID BLANK LINE ABOVE
  51. 510 PG = 0:EOD = 0
  52. 520 X =  FRE(0): REM CLEAR MEMORY OF OLD VALUES OF CHANGED STRINGS   
  53. 530  PRINT D$;"CLOSE";P$
  54. 540  PRINT D$;"OPEN ";P$;",TDIR"
  55. 550  PRINT D$;"READ";P$
  56. 560  INPUT A$: INPUT LA$: INPUT A$: REM READ HEADER  
  57. 570 :
  58. 580  REM READ DIRECTORY FILES
  59. 590  IF EOD = 1  THEN  GOTO 700: REM NO MORE FILES
  60. 600 PG = PG +1
  61. 610  VTAB 23: POKE HT,79: PRINT : REM AVOID BLANK LINE ABOVE
  62. 620  FOR J = 1 TO 20
  63. 630  INPUT FI$(J): REM READ FILEINFO
  64. 640  IF FI$(J) = ""  THEN  INPUT "";ST$:EOD = 1: GOTO 660: REM END OF DIR 
  65. 650  NEXT 
  66. 660 NL = J -1: REM NUMBER OF LINES READ  
  67. 670 OI = 1: REM RESET DISPLAY LINE
  68. 680 :
  69. 690  REM SELECT DIRECTORY FILE
  70. 700  HOME : PRINT P$: PRINT LA$: REM PRINT PATH & LABELS   
  71. 710  FOR I = 1 TO NL: GOSUB 920: NEXT : GOSUB 990:I = OI: GOSUB 910
  72. 720  IF EOD = 1  THEN  VTAB NL +3: IF NL <20  THEN  PRINT 
  73. 730  IF EOD = 1  THEN  PRINT ST$
  74. 740  VTAB 1: POKE HT,68: PRINT "PAGE ";PG;: POKE HT,77: PRINT "-->";
  75. 750  IF EOD = 1  THEN  VTAB 1: POKE HT,77: PRINT "<--";
  76. 760  GOSUB 1030: REM GET KEY   
  77. 770  IF K = 13  THEN K = I: GOTO 1330: REM RETURN -- CHECK FILETYPE
  78. 780  IF K = 8  THEN  GOSUB 920: PRINT D$;"CLOSE": GOTO 500: REM LEFT
  79. 790  IF K = 11  THEN  GOSUB 920:I = I -1: REM UP
  80. 800  IF K = 21  THEN  GOSUB 920: GOTO 590: REM RIGHT     
  81. 810  IF K = 10  THEN  GOSUB 920:I = I +1: REM DOWN  
  82. 820  IF K = 27  THEN 1470: REM ESC -- RESTART
  83. 830  IF K >96  AND K <123  THEN K = K -32: REM SMALL LETTERS
  84. 840  IF K >64  AND K <85  THEN  GOSUB 920:I = K -64: REM LETTERS A-T  
  85. 850  IF I >NL  THEN I = NL
  86. 860  IF I <1  THEN I = 1
  87. 870 OI = I
  88. 880  GOSUB 910: GOTO 760
  89. 890 :
  90. 900  REM DISPLAY DIRECTORY FILES
  91. 910  INVERSE 
  92. 920 V = I +2
  93. 930  VTAB V: POKE HT,1: PRINT FI$(I);: NORMAL 
  94. 940  INVERSE :VA = I +64
  95. 950  VTAB V: POKE HT,0: PRINT  CHR$(VA);
  96. 960  NORMAL : RETURN 
  97. 970 :
  98. 980  REM DISPLAY PROGRAM TITLE
  99. 990  VTAB 23: POKE HT,0: INVERSE : PRINT  SPC( 2);"FILE SIFTER ";
  100. 1000  RETURN 
  101. 1010 :
  102. 1020  REM GET KEY FROM KEYBOARD
  103. 1030 K =  PEEK(49152): IF K <128  THEN 1030
  104. 1040 K = K -128: POKE 49168,0: RETURN 
  105. 1050 :
  106. 1060  REM CLEAR LINE
  107. 1070  VTAB 24: POKE HT,0: PRINT  SPC( 79);: RETURN 
  108. 1080 :
  109. 1090  REM GET LINE FROM KEYBOARD
  110. 1100 V =  PEEK(37) +1:H = 30
  111. 1110 GL$ = ""
  112. 1120  GOSUB 1030: REM GET KEY
  113. 1130  IF K = 13  THEN  RETURN : REM RETURN
  114. 1140 LL =  LEN(GL$)
  115. 1150  IF K = 27  THEN 1280: REM ESC -- BACKUP
  116. 1160  IF K < >8  AND K < >127  THEN 1220: REM NOT LEFT
  117. 1170 LL = LL -1: REM LEFT
  118. 1180  IF LL >0  THEN GL$ =  LEFT$(GL$,LL)
  119. 1190  IF LL = 0  THEN GL$ = ""
  120. 1200  VTAB V: POKE HT,H +LL +1: PRINT " ";
  121. 1210  GOTO 1120: REM GET ANOTHER CHARACTER    
  122. 1220  IF LL = 40  THEN 1120: REM LIMIT 40 CHARACTERS   
  123. 1230  IF IS = 0  AND K >47  AND K <58  THEN GL$ = GL$ + CHR$(K): REM #
  124. 1240  IF IS = 1  AND K >31  THEN GL$ = GL$ + CHR$(K): REM STRING
  125. 1250  VTAB V: POKE HT,H +LL +1
  126. 1260  IF  LEN(GL$) >LL  THEN  PRINT  CHR$(K);
  127. 1270  GOTO 1120: REM GET NEXT CHARACTER 
  128. 1280  IF LL >0  THEN  VTAB V: POKE HT,H: PRINT  SPC( LL +1): GOTO 1110
  129. 1290 GL$ =  CHR$(27)
  130. 1300  RETURN : REM escape when blank
  131. 1310 :
  132. 1320  REM CHECK FILETYPE   
  133. 1330 NM$ =  MID$ (FI$(I),2,16): REM GET FILENAME 
  134. 1340  FOR J = 1 TO 15: REM TO STRIP TRAILING BLANKS
  135. 1350  IF  RIGHT$(NM$,1) = " "  THEN NM$ =  LEFT$(NM$, LEN(NM$) -1)
  136. 1360  NEXT J
  137. 1370 FT$ =  MID$ (FI$(I),18,3): REM get file type   
  138. 1380  IF FT$ = "DIR"  THEN P$ = P$ +"/" +NM$: GOTO 1630: REM READ NEW DIR
  139. 1390 PI$ = P$ +"/" +NM$: REM PATH FOR INPUT FILE
  140. 1400  IF FT$ = "TXT"  OR FT$ = "AWP"  THEN 1720: REM DISPLAY OPTIONS
  141. 1410  VTAB 24: POKE HT,0: INVERSE 
  142. 1420  PRINT "Filetype is not TXT or AWP.  Proceed anyway? <N> ";
  143. 1430  NORMAL : GOSUB 1030: IF K = 89  OR K = 121  THEN 1720: REM YES 
  144. 1440  GOSUB 1070: GOTO 760: REM NO
  145. 1450 :
  146. 1460  REM RESTART
  147. 1470  PRINT D$;"CLOSE": GOSUB 1070
  148. 1480  IF LA$ = ""  THEN 1660: REM DIRECTORY NOT READ   
  149. 1490  IF FT$ = ""  OR FT$ = "DIR"  THEN 1540: REM NO INPUT FILE YET
  150. 1500  VTAB 24: POKE HT,0
  151. 1510  INVERSE : PRINT "SAME INPUT FILE? <Y>";: NORMAL 
  152. 1520  GOSUB 1030: IF K = 78  OR K = 110  OR K = 27  THEN  GOSUB 1070: GOTO 1540
  153. 1530  GOTO 1720: REM DISPLAY OPTIONS
  154. 1540  VTAB 24: POKE HT,0
  155. 1550  INVERSE : PRINT "DISPLAY PREVIOUS DIRECTORY? <Y>";: NORMAL 
  156. 1560  GOSUB 1030: IF K = 78  OR K = 110  OR K = 27  THEN  GOSUB 1070: GOTO 1660
  157. 1570 V = 24: GOSUB 1070
  158. 1580 NP$ = P$
  159. 1590 NP$ =  LEFT$(NP$, LEN(NP$) -1): REM STRIP SUBDIRECTORY NAME
  160. 1600  IF  RIGHT$(NP$,1) < >"/"  THEN 1590
  161. 1610  IF  LEN(NP$) = 1  THEN 1630: REM WAS ROOT DIRECTORY
  162. 1620 P$ =  LEFT$(NP$, LEN(NP$) -1): REM STRIP TRAILING SLASH
  163. 1630  VTAB 3: POKE HT,0: PRINT  SPC( 80);
  164. 1640  VTAB 23: POKE HT,0: INVERSE : PRINT "READING DIRECTORY ";P$;
  165. 1650  NORMAL : GOTO 450: REM RESET PREFIX  
  166. 1660  POKE HT,0
  167. 1670  VTAB 24: INVERSE : PRINT "RESTART? <Y> ";
  168. 1680  NORMAL : GOSUB 1030: IF K = 78  OR K = 110  OR K = 27  THEN  END 
  169. 1690  GOTO 160: REM GREETING
  170. 1700 :
  171. 1710  REM DISPLAY OPTIONS MENU
  172. 1720  HOME 
  173. 1730  PRINT "PATHNAME OF INPUT FILE: ";PI$
  174. 1740  PRINT 
  175. 1750  PRINT "CONTROL CHARACTER OPTIONS: "
  176. 1760  PRINT "(1) delete all control characters"
  177. 1770  PRINT "(2) convert to ^"
  178. 1780  PRINT "(3) convert to [Letter]"
  179. 1790  PRINT "(4) keep all (uses 2 for preview)"
  180. 1800  PRINT "CHOICE? <1> ";
  181. 1810  GOSUB 1030: REM get key
  182. 1820  IF K = 27  THEN 1470: REM RESTART 
  183. 1830  IF K = 13  THEN CC = 1: PRINT : GOTO 1860: REM return  
  184. 1840  IF K <49  OR K >53  THEN 1810: REM NOT 1-4
  185. 1850  PRINT  CHR$(K):CC = K -48
  186. 1860  PRINT 
  187. 1870  PRINT "CARRIAGE RETURN OPTIONS: "
  188. 1880  PRINT "(1) keep only before indented lines"
  189. 1890  PRINT "(2) convert double carriage returns to single"
  190. 1900  PRINT "(3) keep all blank lines"
  191. 1910  PRINT "(4) keep all carriage returns"
  192. 1920  PRINT "CHOICE? <3> ";
  193. 1930  GOSUB 1030: REM get key
  194. 1940  IF K = 27  THEN 1720: REM DISPLAY OPTIONS
  195. 1950  IF K = 13  THEN CR = 3: PRINT : GOTO 1980: REM return
  196. 1960  IF K <49  OR K >53  THEN 1930: REM NOT 1-4
  197. 1970  PRINT  CHR$(K):CR = K -48
  198. 1980  PRINT 
  199. 1990  PRINT "LEFT MARGIN OPTION:"
  200. 2000  PRINT "Maximum spaces to delete? <0> ";
  201. 2010 IS = 0: GOSUB 1100: REM GET LINE
  202. 2020  IF GL$ =  CHR$(27)  THEN 1720: REM display options
  203. 2030 SP =  VAL(GL$): IF GL$ = ""  THEN SP = 0
  204. 2040  PRINT : PRINT 
  205. 2050 :
  206. 2060  REM PREVIEW
  207. 2070  PRINT "PREVIEW EFFECTS OF OPTIONS? <Y> ";
  208. 2080  GOSUB 1030: REM GET KEY
  209. 2090  IF K >31  THEN  PRINT  CHR$(K);
  210. 2100  PRINT :PV = 1: REM DEFAULT    
  211. 2110  IF K = 78  OR K = 110  OR K = 27  THEN PV = 0
  212. 2120 PC = CC: IF CC = 4  AND PV = 1  THEN PC = 2: REM PREVIEW OPTION 4 AS 2
  213. 2130  IF PV = 1  THEN  PRINT "PRESS ESC TO STOP PREVIEW"
  214. 2140 :
  215. 2150  REM OPEN INPUT FILE
  216. 2160  PRINT D$;"CLOSE": REM CLOSE DIR
  217. 2170 X =  FRE(0): REM CLEAR MEMORY OF OLD STRINGS  
  218. 2180  FOR J = 1 TO 10:W$(J) = "": NEXT J:J = 1: REM CLEAR OUTPUT LINES
  219. 2190 EOF = 0:NC = 0:RC = 0:SC = 0:FL = 1:KP = 0: REM RESET COUNTS FOR FORMAT
  220. 2200 TS = 0
  221. 2210 B = 0: IF FT$ = "AWP"  THEN B = 300: REM SKIP AWP HEADER
  222. 2220  PRINT D$;"OPEN ";PI$;",T";FT$
  223. 2230  REM IF ERROR THEN GOTO RESTART
  224. 2240 A = 0: REM INDEX FOR AWP FORMAT CODES
  225. 2250  IF PV = 1  THEN 2450: REM INPUT BUFFER
  226. 2260 :
  227. 2270  REM OUTPUT PATHNAME
  228. 2280  PRINT 
  229. 2290  PRINT "PATHNAME OF OUTPUT FILE: ";
  230. 2300 IS = 1: GOSUB 1100:PW$ = GL$: REM GET LINE
  231. 2310  PRINT 
  232. 2320  IF GL$ =  CHR$(27)  THEN 1720: REM DISPLAY OPTIONS
  233. 2330  PRINT 
  234. 2340  PRINT D$;"CREATE";PW$;",TTXT": GOTO 2420
  235. 2350  REM IF ERROR <>19 THEN GOTO OPEN OUTPUT FILE
  236. 2360  PRINT "FILE ALREADY EXISTS.  DELETE IT? <N> "
  237. 2370  GOSUB 1030: REM GET KEY
  238. 2380  IF K = 121  OR K = 89  THEN  PRINT D$;"DELETE";PW$: GOTO 2420
  239. 2390  GOTO 2280: REM GET OUTPUT PATHNAME IF NOT YES
  240. 2400 :
  241. 2410  REM OPEN OUTPUT FILE
  242. 2420  PRINT D$;"OPEN";PW$
  243. 2430 :
  244. 2440  REM INPUT BUFFER
  245. 2450  INVERSE : PRINT ; SPC( 13);"READING BUFFER"; SPC( 2);: NORMAL 
  246. 2460  IF FT$ = "AWP"  AND FL = 1  THEN  INVERSE : PRINT "......";: NORMAL 
  247. 2470  REM READ CHARACTER FROM INPUT BUFFER
  248. 2480 BC = B/50: IF BC =  INT(BC)  THEN  INVERSE : PRINT ".";: NORMAL 
  249. 2490  IF B = 512  THEN 2920: REM WRITE BUFFER     
  250. 2500 A = A +1:KP = K:K = 0:K =  PEEK(38400 +B):B = B +1
  251. 2510  REM CHECK FOR END OF FILE
  252. 2520  IF FT$ = "AWP"  AND C(1) = 255  AND K = 255  THEN 2920: REM END OF AWP
  253. 2530  REM IF ERROR=2 THEN SET EOF=1 AND GOTO FORMAT OUTPUT 
  254. 2540  IF FT$ < >"AWP"  THEN 2840: REM PROCESS TXT CHARACTER
  255. 2550 :
  256. 2560  REM PROCESS AWP CHARACTER
  257. 2570  IF A <5  THEN C(A) = K: REM FORMAT CODES 
  258. 2580  REM C(1)-2 IS LINE LENGTH, C(2)=208 IS BLANK LINE, C(3) IS INDENTATION
  259. 2590  IF A <2 GOTO 2480: REM CHECK NEXT CHARACTER 
  260. 2600  IF C(2) < >0  THEN A = 0: REM RESET AFTER FORMAT CODES
  261. 2610  IF C(2) = 208  THEN W$(J) = W$(J) + CHR$(13): REM BLANK LINE   
  262. 2620  IF A <5 GOTO 2480: REM DON'T PRINT FIRST 4 CHARACTERS  
  263. 2630  IF C(3) = 255  THEN 2690: REM SKIP TAB RULER
  264. 2640  IF C(3) < >255  AND C(3) >127  THEN C(3) = C(3) -128
  265. 2650  IF A = 5  AND C(3) >0  THEN  FOR M = 1 TO C(3):W$(J) = W$(J) + CHR$(32): NEXT M
  266. 2660  REM ABOVE INDENTS LINE  C(3) SPACES  
  267. 2670  IF (K = 22  OR K = 23)  THEN K = 32: REM TAB SPACES
  268. 2680  GOSUB 2740: REM CONVERT CHARACTER 
  269. 2690  IF ((A -4) <(C(1) -2)) GOTO 2480: REM CHECK LENGTH OF LINE
  270. 2700  IF C(3) = 255  THEN A = 0: GOTO 2480: REM END OF TAB RULER
  271. 2710 W$(J) = W$(J) + CHR$(13):A = 0: GOTO 2480: REM END OF LINE 
  272. 2720 :
  273. 2730  REM CONVERT CHARACTER
  274. 2740  IF PC = 1  AND KP = 27  THEN 2810: REM SKIP PRINTER CODE AFTER ESC
  275. 2750  IF  LEN(W$(J)) >175  THEN J = J +1
  276. 2760  IF K >31  THEN W$(J) = W$(J) + CHR$(K)
  277. 2770  IF PC = 2  AND K <32  THEN W$(J) = W$(J) + CHR$(94): REM ^
  278. 2780  IF PC = 3  AND K <32  THEN W$(J) = W$(J) + CHR$(91) + CHR$(K +64) + CHR$(93)
  279. 2790  IF PC = 4  AND K <32  THEN W$(J) = W$(J) + CHR$(K)
  280. 2800  GOSUB 3340: IF E = 27  THEN  POP : GOTO 3380: REM CHECK ESC     
  281. 2810  RETURN 
  282. 2820 :
  283. 2830  REM PROCESS TXT CHARACTER
  284. 2840  IF K = 0  THEN NC = NC +1: GOTO 2480: REM COUNT NULL CHARACTERS
  285. 2850  IF K < >0  AND NC >0  THEN NK = K: GOSUB 2890:K = NK:NC = 0: REM PROCESS NULLS
  286. 2860  IF K = 13  THEN W$(J) = W$(J) + CHR$(13): GOTO 2480: REM RETURN  
  287. 2870  IF K >127  THEN K = K -128: REM STRIP ASCII HIGH BIT    
  288. 2880  GOSUB 2740: GOTO 2480: REM CONVERT CHARACTER THEN GET NEW CHARACTER  
  289. 2890 K = 0: FOR I = 1 TO NC: GOSUB 2740: NEXT I: RETURN : REM FORMAT NULLS
  290. 2900 :
  291. 2910  REM FORMAT OUTPUT
  292. 2920  IF BC <10  THEN XS = 10 - INT(BC): INVERSE : PRINT  SPC( XS): NORMAL 
  293. 2930  INVERSE : PRINT ; SPC( 13);"WRITING BUFFER"; SPC( 13);: NORMAL 
  294. 2940  IF PV = 0  THEN  PRINT D$;"WRITE";PW$
  295. 2950  FOR J = 1 TO 20: IF EOF = 1  THEN 3060
  296. 2960  IF W$(J) = ""  THEN 3270: REM PROCESS END OF BUFFER
  297. 2970  FOR I = 1 TO  LEN(W$(J))
  298. 2980 WC$ =  MID$ (W$(J),I,1): REM GET CHARACTER
  299. 2990  IF RC = 0  AND WC$ =  CHR$(32)  THEN TS = TS +1: GOTO 3230
  300. 3000  REM ABOVE PRINTS EMBEDDED SPACES
  301. 3010  IF WC$ =  CHR$(13)  THEN RC = RC +1:SC = 0:FL = 0:TS = 0: GOTO 3230
  302. 3020  REM SPACES BETWEEEN CARRIAGE RETURNS ARE IGNORED
  303. 3030  IF (RC >0  OR FL = 1)  AND WC$ =  CHR$(32)  THEN SC = SC +1: GOTO 3230
  304. 3040  REM COUNT RC AND SC UNTIL A DIFFERENT CHARACTER IS FOUND
  305. 3050  IF TS >0  THEN  FOR M = 1 TO TS: PRINT  CHR$(32);: NEXT M:TS = 0
  306. 3060  IF CR = 4  AND RC >0  THEN  FOR M = 1 TO RC: PRINT  CHR$(13);: NEXT M
  307. 3070  REM ABOVE PRINTS ALL CARRIAGE RETURNS
  308. 3080  IF CR = 3  AND RC >1  THEN  FOR M = 1 TO RC: PRINT  CHR$(13);: NEXT M
  309. 3090  REM ABOVE PRINTS ALL BLANK LINES
  310. 3100 HC =  INT(RC/2): REM CONVERTS DOUBLE BLANK LINES TO SINGLE
  311. 3110  IF CR = 2  AND HC >0  THEN  FOR M = 1 TO HC: PRINT  CHR$(13);: NEXT M
  312. 3120  REM ABOVE PRINTS DOUBLE BLANK LINES AS SINGLE BLANK LINES
  313. 3130  IF CR = 1  AND RC >1  AND SC >0  THEN  PRINT  CHR$(13);
  314. 3140  IF CR < >4  AND RC = 1  AND SC >0  THEN  PRINT  CHR$(13);
  315. 3150  REM ABOVE PRINTS RETURN BEFORE INDENTED LINES
  316. 3160  IF CR <4  AND RC = 1  AND SC = 0  THEN  PRINT  CHR$(32);: REM SPACE
  317. 3170  IF CR = 2  AND RC = 2  AND SC = 0  THEN  PRINT  CHR$(32);: REM SPACE 
  318. 3180  IF CR = 1  AND RC >1  AND SC = 0  THEN  PRINT  CHR$(32);: REM SPACE
  319. 3190  IF (FL = 1  OR RC >0)  AND SC >SP  THEN  PRINT  SPC( SC -SP);
  320. 3200  IF EOF = 1  THEN  PRINT D$: GOTO 3400: REM END OF FILE 
  321. 3210  IF WC$ < > CHR$(4)  THEN  PRINT WC$;: REM PRINT NEXT CHARACTER
  322. 3220 RC = 0:SC = 0:FL = 0: IF WC$ =  CHR$(4)  THEN  PRINT  CHR$(94);
  323. 3230  GOSUB 3340: IF E = 27  THEN 3380
  324. 3240  NEXT I
  325. 3250  NEXT J
  326. 3260  REM PROCESS END OF BUFFER
  327. 3270  PRINT D$: REM STOP PRINTING TO OUTPUT FILE     
  328. 3280  FOR J = 1 TO 10:W$(J) = "": NEXT J:J = 1: REM CLEAR OUTPUT LINES
  329. 3290  PRINT D$;"READ";PI$;",B512": REM READ MORE INTO INPUT BUFFER
  330. 3300 B = 0: REM RESET BUFFER CHARACTER COUNT
  331. 3310 X =  FRE(0): GOTO 2450: REM INPUT BUFFER   
  332. 3320 :
  333. 3330  REM CHECK FOR ESCAPE
  334. 3340 E =  PEEK(49152):E = E -128: POKE 49168,0: RETURN 
  335. 3350  REM BRANCH AFTER ESC OR EOF
  336. 3360  PRINT D$;"CLOSE": REM CLOSE  ALL FILES
  337. 3370  PRINT 
  338. 3380  IF PV = 1  THEN PV = 0:PC = CC: GOTO 2160: REM OPEN INPUT FILE 
  339. 3390  IF PV = 0  THEN 1470: REM RESTART    
  340. 3400  INVERSE : PRINT "<END OF FILE>";: NORMAL 
  341. 3410  PRINT 
  342. 3420  GOTO 3360
  343. 3430 :
  344. 3440  REM ERROR ROUTINE
  345. 3450 EN =  PEEK(222): REM GET ERROR NUMBER  
  346. 3460 EL =  PEEK(219) *256 + PEEK(218): REM GET LINE 
  347. 3470  POKE 216,0: CALL  -3288
  348. 3480  ONERR  GOTO 3450 REM RESET ERROR TRAPPING   
  349. 3490  IF EN = 2  THEN EOF = 1: GOTO 2940: REM RANGE ERROR   
  350. 3500  IF EN = 19  THEN  GOTO 2360: REM DUPLICATE FILENAME 
  351. 3510  IF EN = 255  THEN  END : REM TRAPPED CTRL-C
  352. 3520  PRINT  CHR$(4);"CLOSE": REM CLOSE ALL FILES
  353. 3530  VTAB 23: POKE HT,0
  354. 3540  INVERSE : PRINT "ERROR ";EN;" ON LINE ";EL;
  355. 3550  IF EN = 254  THEN 1470: REM TRAPPED ESC
  356. 3560  IF EN = 4  THEN  PRINT " -- WRITE PROTECTED";
  357. 3570  IF EN = 6  THEN  PRINT " -- PATH NOT FOUND";
  358. 3580  IF EN = 8  THEN  PRINT " -- I/O ERROR";
  359. 3590  IF EN = 11  OR EN = 16  THEN  PRINT " -- SYNTAX ERROR";
  360. 3600  PRINT " -- ";: NORMAL 
  361. 3610  INVERSE 
  362. 3620  PRINT "PRESS ANY KEY ";: NORMAL : PRINT " ";
  363. 3630  GOSUB 1030: REM GET KEY
  364. 3640  GOTO 1470: REM RESTART
  365. 3650 :
  366. 3660  REM BAS TO TXT
  367. 3670  PRINT : INPUT "PATHNAME FOR TEXTFILE? ";F$
  368. 3680  PRINT  CHR$(4);"CREATE";F$;",TTXT"
  369. 3690  PRINT  CHR$(4);"OPEN";F$
  370. 3700  PRINT  CHR$(4);"WRITE";F$: LIST 
  371. 3710  PRINT  CHR$(4);"CLOSE": END